package com.woniuxy.shirodemo;

import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 进行自定义域的开发，未来的开发模式和这个一致
 */
public class MyRealm extends AuthorizingRealm {
    /**
     * 获取授权信息 z
     * @param principals
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        //通过这个方法获取username
        String username = (String)principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        //角色集合从哪来？？？去数据库查的 下面的role和perm权限，都是基于username查出来的
        simpleAuthorizationInfo.addRole("role1");
        simpleAuthorizationInfo.addRole("role2");
        simpleAuthorizationInfo.addStringPermission("user:add");
//        simpleAuthorizationInfo.setRoles();//放入角色的集合 set集合 这个集合从数据库查出来的
//        simpleAuthorizationInfo.setStringPermissions();//放入权限的set集合
        /* 第二种写法
         *通过用户名 去数据库查询 所有的角色  和   权限
         *
         *先去数据库查询当前用户 所有的角色
         *
         *再去通过 所有的角色  查询出所有的权限
         *
         */
//        Set<String> roles = new HashSet();
//        roles.add("role1");
//        roles.add("role2");
//        Set<String> perms = new HashSet();
//        perms.add("user:add");
//        perms.add("user:delete");
//        perms.add("user:update");
//        perms.add("user:find");
//        perms.add("user:find");
//        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//        simpleAuthorizationInfo.addRoles(roles);
//        simpleAuthorizationInfo.addStringPermissions(perms);
        return simpleAuthorizationInfo;
    }

    /**
     * 获取认证信息
     * @param token
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //获取形参，然后强转token为UsernamePasswordToken
        UsernamePasswordToken token1 = (UsernamePasswordToken) token;
        //通过  UsernamePasswordToken 来获取用户信息
        String username = token1.getUsername();
        String password = new String(token1.getPassword());
        //是不是需要我们进行账号密码判断，和数据库的进行匹配
        //模拟数据：
        if(!password.equals("123456")){
            throw new AuthenticationException("密码错误");
        }else{
            return new SimpleAuthenticationInfo(username,password,"MyRealm");
        }
    }
}
